#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
// 包含环形缓冲区头文件
#include <stdbool.h>
#include "../buffer/ringfifo.h"
// 添加君正SDK头文件 - 原始RTSP代码中没有这个头文件
#include "../encode/sample-common.h" // 包含君正SDK的头文件

// 主要变更：
// 1. 添加了Live555 RTSP服务器的初始化和停止函数
// 2. 使用君正SDK的编码器功能代替原始RTSP代码中的编码逻辑
// 3. 移除了HisiPutH264DataToBuffer函数实现，移至ringfifo.c

// 全局变量定义
static int g_run = 1;
ringbuf g_rf; // 全局环形缓冲区变量

// 函数声明
extern bool rtsp_server_start(int port);
extern void rtsp_server_stop();
extern void rtsp_server_mainloop();
extern void *SAMPLE_VENC_1080P_CLASSIC(void *arg); // 君正SDK编码器函数

// 全局停止标志
int stop = 1;

// 信号处理函数
void handleSignal(int signum) {
    printf("Signal received, shutting down...\n");
    stop = 0;
    rtsp_server_stop();
}

// HisiPutH264DataToBuffer函数在ringfifo.c中实现
// 注意：原始RTSP代码中该函数在main.c中，在live555版本中移至ringfifo.c以保持代码结构一致

int main(int argc, char *argv[])
{
    pthread_t encoderThread;

    // 设置信号处理
    signal(SIGINT, handleSignal);
    signal(SIGTERM, handleSignal);

    // 初始化环形缓冲区
    printf("Initializing ring buffer...\n");
    ringmalloc(2 * 1024 * 1024); // 分配2MB的缓冲区

    // 创建视频编码线程
    printf("Starting video encoder thread...\n");
    if (pthread_create(&encoderThread, NULL, SAMPLE_VENC_1080P_CLASSIC, NULL) != 0) {
        printf("Failed to create encoder thread\n");
        ringfree();
        return -1;
    }

    // 初始化Live555 RTSP服务器
    printf("Initializing Live555 RTSP Server...\n");
    
    // 启动RTSP服务器（默认端口8554）
    if (!rtsp_server_start(8554)) {
        printf("Failed to start RTSP server\n");
        pthread_join(encoderThread, NULL);
        ringfree();
        return -1;
    }
    
    // 运行RTSP服务器主循环
    rtsp_server_mainloop();
    
    // 主线程保持运行
    // 与原始RTSP代码的区别：简化了主线程逻辑，主要依赖Live555的事件循环
    printf("Server running. Press Ctrl+C to stop.\n");
    while (stop) {
        sleep(1);
    }

    // 等待编码器线程结束
    pthread_join(encoderThread, NULL);
    
    // 清理资源
    rtsp_server_stop();
    ringfree();
    printf("Server stopped!\n");
    return 0;
}

/*
void ringmalloc(int size)
{
    int i;
    for(i =0; i<NMAX; i++)
    {
        ringfifo[i].buffer = malloc(size);
        ringfifo[i].size = 0;
        ringfifo[i].frame_type = 0;
       // printf("FIFO INFO:idx:%d,len:%d,ptr:%x\n",i,ringfifo[i].size,(int)(ringfifo[i].buffer));
    }
    iput = 0; 
    iget = 0; 
    n = 0; 
}
*/